const express = require('express')
const { Sequelize, DataTypes, Op } = require('sequelize')

// 配置 SQLite 数据库连接
const sequelize = new Sequelize({
    dialect: 'sqlite',
    storage: './database.sqlite'
})

// 定义用户模型（数据库表）
const User = sequelize.define('User', {
    name: DataTypes.STRING, // 用户姓名
    age: DataTypes.NUMBER,  // 用户年龄
    gender: DataTypes.STRING // 用户性别
})

// 创建或同步数据库表
User.sync()

const app = express()
// 解析 JSON 请求体数据
app.use(express.json())

// 设置跨域请求头，允许所有来源
app.all('*', (req, res, next) => {
    res.header('Access-Control-Allow-Origin', '*')
    res.header('Access-Control-Allow-Headers', 'Content-Type')
    res.header('Access-Control-Allow-Methods', 'GET,POST,DELETE,PATCH')
    if (req.method === 'OPTIONS') {
        res.sendStatus(200)
    } else {
        next()
    }
})

// 新增用户数据
app.post('/users', async (req, res) => {
    const { name, age, gender } = req.body
    await User.create({ name, age, gender })
    return res.sendStatus(200)
})

// 获取用户数据列表，支持分页与模糊查询
app.get('/users', async (req, res) => {
    const { name, current } = req.query
    const offset = (current - 1) * 10
    let where = {}
    if (name) {
        where = { name: { [Op.like]: `%${name}%` } }
    }
    const { count: total, rows: users } = await User.findAndCountAll({ order: [['createdAt', 'DESC']], limit: 10, where, offset })
    return res.status(200).json({ total, users })
})

// 更新指定 ID 的用户数据
app.patch('/users/:id', async (req, res) => {
    const { name, age, gender } = req.body
    const { id } = req.params
    await User.update({ name, age, gender }, { where: { id } })
    return res.sendStatus(200)
})

// 删除指定 ID 的用户数据
app.delete('/users/:id', async (req, res) => {
    const { id } = req.params
    await User.destroy({ where: { id } })
    res.sendStatus(200)
})

// 启动服务器，监听 3000 端口
app.listen(3000, () => {
    console.log('server start port 3000')
})
